home *** CD-ROM | disk | FTP | other *** search
- #!/usr/bin/perl
-
- eval "use NKF;";
- if (! $@) {
- $use_NKF = 1;
- $CONV = "-e";
- $MIME_DECODE = "-m -e";
- } else {
- $use_NKF = 0;
- # $CONV = "w3m -dump -e";
- $CONV = "/usr/local/bin/nkf -e";
- $MIME_DECODE = "/usr/local/bin/nkf -m -e";
- }
- $MIME_TYPE = "$ENV{'HOME'}/.mime.types";
-
- $SCRIPT_NAME = $ENV{'SCRIPT_NAME'} || $0;
- $CGI = "file://$SCRIPT_NAME";
-
- if ($ENV{'REQUEST_METHOD'} eq 'POST') {
- sysread(STDIN, $query, $ENV{'CONTENT_LENGTH'});
- } elsif (defined($ENV{'QUERY_STRING'})) {
- $query = $ENV{'QUERY_STRING'};
- }
- if (defined($query)) {
- for (split('&', $query)) {
- s/^([^=]*)=//;
- $v{$1} = $_;
- }
- $file = &form_decode($v{'file'});
- $boundary = &form_decode($v{'boundary'});
- } else {
- $file = $ARGV[0];
- if (@ARGV >= 2) {
- $boundary = $ARGV[1];
- }
- }
- (-f $file) || exit(1);
- open(F, "< $file") || exit(1);
- $end = 0;
- $mbody = '';
- if (defined($boundary)) {
- while(<F>) {
- s/\r?\n$//;
- ($_ eq "--$boundary") && last;
- ($_ eq "--$boundary--") && ($end = 1, last);
- $mbody .= "$_\n";
- }
- } else {
- while(<F>) {
- s/\r?\n$//;
- if (s/^\-\-//) {
- $boundary = $_;
- last;
- }
- $mbody .= "$_\n";
- }
- }
-
- if (defined($v{'count'})) {
- $count = 0;
- while($count < $v{'count'}) {
- while(<F>) {
- s/\r?\n$//;
- ($_ eq "--$boundary") && last;
- }
- eof(F) && exit;
- $count++;
- }
-
- %header = ();
- $hbody = '';
- while(<F>) {
- /^\s*$/ && last;
- $x = $_;
- s/\r?\n$//;
- if (/=\?/) {
- $_ = &decode($_, $MIME_DECODE);
- }
- if (s/^(\S+)\s*:\s*//) {
- $h = $&;
- if ($h =~ /^w3m-control/i) {
- $h = "WARNING: $h";
- }
- $hbody .= "$h$_\n";
- $p = $1;
- $p =~ tr/A-Z/a-z/;
- $header{$p} = $_;
- } elsif (s/^\s+//) {
- chop $hbody;
- $hbody .= "$_\n";
- $header{$p} .= $_;
- }
- }
- $type = $header{"content-type"};
- $dispos = $header{"content-disposition"};
- if ($type =~ /application\/octet-stream/) {
- if ($type =~ /type\=gzip/) {
- print "Content-Encoding: x-gzip\n";
- }
- if ($type =~ /name=\"?([^\"]+)\"?/ ||
- $dispos =~ /filename=\"?([^\"]+)\"?/) {
- $type = &guess_type($1);
- if ($type) {
- print "Content-Type: $type; name=\"$1\"\n";
- } else {
- print "Content-Type: text/plain; name=\"$1\"\n";
- }
- }
- }
- print $hbody;
- print "\n";
- while(<F>) {
- $x = $_;
- s/\r?\n$//;
- ($_ eq "--$boundary") && last;
- if ($_ eq "--$boundary--") {
- last;
- }
- print $x;
- }
- close(F);
- exit;
- }
-
- $qcgi = &html_quote($CGI);
- $qfile = &html_quote($file);
- $qboundary = &html_quote($boundary);
-
- if ($mbody =~ /\S/) {
- $_ = $mbody;
- s/\&/\&/g;
- s/\</\</g;
- s/\>/\>/g;
- print "<pre>\n";
- print $_;
- print "</pre>\n";
- }
-
- $count = 0;
- while(! $end) {
- %header = ();
- $hbody = '';
- while(<F>) {
- /^\s*$/ && last;
- s/\r?\n$//;
- if (/=\?/) {
- $_ = &decode($_, $MIME_DECODE);
- }
- if (s/^(\S+)\s*:\s*//) {
- $hbody .= "$&$_\n";
- $p = $1;
- $p =~ tr/A-Z/a-z/;
- $header{$p} = $_;
- } elsif (s/^\s+//) {
- chop $hbody;
- $hbody .= "$_\n";
- $header{$p} .= $_;
- }
- }
- $type = $header{"content-type"};
- $dispos = $header{"content-disposition"};
- $plain = 0;
- $image = 0;
- if (! $dispos || $dispos =~ /^inline/i) {
- if (! $type || $type =~ /^text\/plain/i) {
- $plain = 1;
- } elsif ($type =~ /^image\//i) {
- $image = 1;
- }
- }
- $body = '';
- while(<F>) {
- s/\r?\n$//;
- ($_ eq "--$boundary") && last;
- if ($_ eq "--$boundary--") {
- $end = 1;
- last;
- }
- if ($plain) {
- $body .= "$_\n";
- }
- }
- $| = 1;
- print "<hr>\n";
- {
- $_ = $hbody;
- s/\&/\&/g;
- s/\</\</g;
- s/\>/\>/g;
- print "<pre>\n";
- print $_;
- print "</pre>\n";
- if ($type =~ /name=\"?([^\"]+)\"?/ ||
- $dispos =~ /filename=\"?([^\"]+)\"?/) {
- $name = $1;
- } else {
- $name = "Content";
- }
- print "<form action=\"$qcgi\">\n";
- print "<input type=hidden name=file value=\"$qfile\">\n";
- print "<input type=hidden name=boundary value=\"$qboundary\">\n";
- print "<input type=hidden name=count value=\"$count\">\n";
- if ($image) {
- print "<input type=image name=submit src=\"$qcgi?file=",
- &html_quote(&form_encode($file)),
- "&boundary=",
- &html_quote(&form_encode($boundary)),
- "&count=$count\" alt=\"",
- &html_quote($name), "\">\n";
- } else {
- print "<input type=submit name=submit value=\"",
- &html_quote($name), "\">\n";
- }
- print "</form>\n"
- }
- if ($plain) {
- $body = &decode($body, $CONV);
- $_ = $body;
- s/\&/\&/g;
- s/\</\</g;
- s/\>/\>/g;
- print "<pre>\n\n";
- print $_;
- print "</pre>\n";
- }
- eof(F) && last;
- $count++;
- }
- close(F);
-
- sub decode {
- if ($use_NKF) {
- local($body, $opt) = @_;
- return nkf($opt, $body);
- }
- local($body, @cmd) = @_;
- local($_);
-
- $| = 1;
- pipe(R, W2);
- pipe(R2, W);
- if (! fork()) {
- close(F);
- close(R);
- close(W);
- open(STDIN, "<&R2");
- open(STDOUT, ">&W2");
- exec @cmd;
- die;
- }
- close(R2);
- close(W2);
- print W $body;
- close(W);
- $body = '';
- while(<R>) {
- $body .= $_;
- }
- close(R);
- return $body;
- }
-
- sub html_quote {
- local($_) = @_;
- local(%QUOTE) = (
- '<', '<',
- '>', '>',
- '&', '&',
- '"', '"',
- );
- s/[<>&"]/$QUOTE{$&}/g;
- return $_;
- }
-
- sub form_decode {
- local($_) = @_;
- s/\+/ /g;
- s/%([\da-f][\da-f])/pack('c', hex($1))/egi;
- return $_;
- }
-
- sub form_encode {
- local($_) = @_;
- s/[\000-\040\+:#?&%<>"\177-\377]/sprintf('%%%02X', unpack('C', $&))/eg;
- return $_;
- }
-
- sub guess_type {
- local($_) = @_;
-
- /\.(\w+)$/ || return "";
- $_ = $1;
- tr/A-Z/a-z/;
- %mime_type = &load_mime_type($MIME_TYPE);
- $mime_type{$_};
- }
-
- sub load_mime_type {
- local($file) = @_;
- local(%m, $a, @b, $_);
-
- open(M, "< $file") || return ();
- while(<M>) {
- /^#/ && next;
- chop;
- (($a, @b) = split(" ")) >= 2 || next;
- for(@b) {
- $m{$_} = $a;
- }
- }
- close(M);
- return %m;
- }
-